﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using CapaDeNegocio;
using CapaDeDominio;

namespace Studio7iMVC2.Controllers
{
    public class SalaController : Controller
    {
        #region Dependencias a inyectarse con Spring.NET
        IAdministracionService AdminService = null;
        #endregion

        public ActionResult Index()
        {
            ICollection<Sala> modelo = AdminService.ListarSalas(
                null, null, null, null);
            TempData["locales"] = ListadoLocales();
            return View(modelo);
        }

        #region Inscripcion

        [HttpPost]
        public ActionResult Buscar(FormCollection formulario)
        {
            string Nombre = formulario["Nombre"];
            int? LocalCodigo = null;
            if (formulario["LocalCodigo"] != null && formulario["LocalCodigo"] != string.Empty)
                LocalCodigo = int.Parse(formulario["LocalCodigo"]);
            int? Capacidad = null;
            if (formulario["Capacidad"] != null && formulario["Capacidad"] != string.Empty)
                Capacidad = int.Parse(formulario["Capacidad"]);
            string Caracteristicas = formulario["Caracteristicas"];
            ICollection<Sala> modelo = AdminService.ListarSalas(
                Nombre, LocalCodigo, Capacidad, Caracteristicas);
            TempData["locales"] = ListadoLocales();
            return View("Index", modelo);
        }

        public ActionResult Inscripcion()
        {
            TempData["locales"] = ListadoLocales();
            return View();
        }

        [HttpPost]
        public ActionResult Inscribir(FormCollection formulario)
        {
            try
            {
                string Nombre = formulario["Nombre"];
                if (formulario["LocalCodigo"] == null || formulario["LocalCodigo"] == string.Empty)
                    throw new Exception("Elija un local");
                int LocalCodigo = int.Parse(formulario["LocalCodigo"]);
                int Capacidad = int.Parse(formulario["Capacidad"]);
                string Caracteristicas = formulario["Caracteristicas"];
                Sala salaInscrita = AdminService.InscribirSala(Nombre, LocalCodigo, Capacidad, Caracteristicas);
                TempData["mensaje"] = "Sala " + salaInscrita.Codigo + " inscrita satisfactoriamente";
                return RedirectToAction("Index");
            }
            catch (Exception ex)
            {
                ModelState.AddModelError(string.Empty, ex.Message);
                TempData["locales"] = ListadoLocales();
                return View("Inscripcion");
            }
        }

        private ICollection<SelectListItem> ListadoLocales()
        {
            ICollection<SelectListItem> locales = new List<SelectListItem>();
            locales.Add(new SelectListItem() { Value = string.Empty, Text = "Seleccione.." });
            foreach (Local local in AdminService.ListarLocales())
                locales.Add(new SelectListItem()
                {
                    Value = local.Codigo.ToString(),
                    Text = local.Nombre
                });
            return locales;
        }
        #endregion

        #region ArmarSala

        public ActionResult ArmarSala(int Codigo)
        {
            cargarDropDownList();
            return View(AdminService.ObtenerSala(Codigo));
        }


        [HttpPost]
        public ActionResult ArmarSala(Sala sala)
        {
            
            //if (ModelState.IsValid)
            //{
               
                try
                {
                    //Se establece el codigo de la Sala
                    int codigo = sala.Codigo;
                    
                    //Se establece el alquiler de la Sala
                    decimal alquiler = sala.alquiler;
                    
                    //Se establece los instrumentos de la Sala
                    ICollection<Instrumento> instrumentos = new List<Instrumento>();
                    if(sala.Instrumentos != null)
                    foreach (Instrumento instrumento in sala.Instrumentos)
                        instrumentos.Add(AdminService.ObtenerInstrumento(instrumento.Codigo));
                    
                    //Se establece los servicios de la sala
                    ICollection<Servicio> servicios = new List<Servicio>();
                    if(sala.Servicios != null)
                    foreach (Servicio servicio in sala.Servicios)
                        servicios.Add(AdminService.ObtenerServicio(servicio.Codigo));

                    AdminService.ArmarSala(codigo, alquiler, instrumentos, servicios);
                    TempData["mensaje"] = "Se armó la Sala " + sala.Codigo + " satisfactoriamente";
                    return RedirectToAction("Index");
                }
                catch (Exception ex)
                {
                    ModelState.AddModelError(string.Empty, ex.Message);
                    cargarDropDownList();
                    return View("ArmarSala", obtenerModeloSala(sala));
                }
            //}
            //else
            //{
            //    cargarDropDownList();
            //    return View("ArmarSala", obtenerModeloSala(sala));
            //}
        }

        private void cargarDropDownList() 
        {
            TempData["instrumentos"] = ListadoInstrumentos();
            TempData["servicios"] = ListadoServicios();
        }
        private Sala obtenerModeloSala(Sala sala)
        {
            int codigo = sala.Codigo;
            decimal alquiler = sala.alquiler;
            ICollection<Instrumento> instrumentos = sala.Instrumentos;
            ICollection<Servicio> servicios = sala.Servicios;

            Sala salaRetorno = AdminService.ObtenerSala(codigo);
            salaRetorno.alquiler = alquiler;
            
            if (instrumentos != null)
            {
                salaRetorno.Instrumentos.Clear();
                foreach (Instrumento instrumento in instrumentos)
                    salaRetorno.Instrumentos.Add(AdminService.ObtenerInstrumento(instrumento.Codigo));
            }
            if (servicios != null)
            {
                salaRetorno.Servicios.Clear();
                foreach (Servicio servicio in servicios)
                    salaRetorno.Servicios.Add(AdminService.ObtenerServicio(servicio.Codigo));
            }
            return salaRetorno;
        }
        /// <summary>
        /// Listado de Instrumentos
        /// </summary>
        /// <returns></returns>
        private ICollection<SelectListItem> ListadoInstrumentos()
        {
            ICollection<SelectListItem> instrumentos = new List<SelectListItem>();
            instrumentos.Add(new SelectListItem() { Value = string.Empty, Text = "Seleccione.." });
            foreach (Instrumento instrumento in AdminService.ListarInstrumentos())
                instrumentos.Add(new SelectListItem()
                {

                    Value = instrumento.Codigo.ToString(),
                    Text = string.Format("{0} - {1}", instrumento.Marca, instrumento.Modelo),

                });

            return instrumentos;
        }

        /// <summary>
        /// Listado de Servicios
        /// </summary>
        /// <returns></returns>
        private ICollection<SelectListItem> ListadoServicios()
        {
            ICollection<SelectListItem> servicios = new List<SelectListItem>();
            servicios.Add(new SelectListItem() { Value = string.Empty, Text = "Seleccione.." });
            foreach (Servicio servicio in AdminService.ListarServicios())
                servicios.Add(new SelectListItem()
                {
                    Value = servicio.Codigo.ToString(),
                    Text = servicio.Descripcion
                });
            return servicios;
        }
        #endregion

        public ActionResult ViewInstrumento(int codigo)
        {
            List<Sala> lstRes = new List<Sala>();
            lstRes.Add(AdminService.ObtenerSala(codigo));
            return View(lstRes.ToList());
        }

        public ActionResult ViewServicio(int codigo)
        {
            List<Sala> lstRes = new List<Sala>();
            lstRes.Add(AdminService.ObtenerSala(codigo));
            return View(lstRes.ToList());
        }
    }
}
